/*
 * @Description: 
 * @Author: rendc
 * @Date: 2024-10-11 10:17:53
 * @LastEditors: rendc
 * @LastEditTime: 2024-10-11 11:27:18
 */
/**
 * ITicketRunable
 */
public class ITicketRunnable implements Runnable {
  // 总票数 50
  private int num = 50;
  // 创建锁对象给同步代码块使用
  Object mutex = new Object();

  @Override
  public void run() {
    while (true) {
      synchronized (mutex) {
        // 1. 线程抢占资源 ，上锁，进入代码块执行
        // 2. 另外两个线程抢不到资源，进入阻塞状态
        // 3. 第一步的线程执行结束，释放资源，解锁
        // 4. 三个线程抢占资源，重新上锁
        // 反复执行
        // 需要同步的内容 - 开始
        if (num <= 0) {
          break;
        }
        String name = Thread.currentThread().getName();
        System.out.println(name + "正在卖票，第" + num + "张票。");
        // 每隔50ms销售一张票
        num--;
        try {
          Thread.sleep(50);
        } catch (Exception e) {
          e.printStackTrace();
        }
        // 线程执行完同步的代码后，会自动释放锁 - 解锁
        // 需要同步的内容 - 结束
        // 或者 break return 也会离开代码块
      }
    }
  }
}
